package com.jt.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Random;

@RestController
public class ConsumerController {
    /**
     * 从spring容器获取一个RestTemplate对象,
     * 基于此对象实现远端服务调用
     */
    @Value("${server.port}")
    private String serverPort;
    @Autowired
    private RestTemplate restTemplate;
    /**两种方法
    @Autowired
    public ConsumerController(RestTemplate restTemplate){
        this.restTemplate=restTemplate;
    }
    */
    /**
     * 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
     * @return
     * 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
     */
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho01(){
        String url="http://localhost:8081/provider/echo/{msg}";
        return restTemplate.getForObject(url, String.class,serverPort);
    }
    /**此对象负责实现对远程进行服务进行负载均衡方式的获取,
     * 底层默认基于Ribbon组件(负载均衡组件)中内置算法(轮询,随机,hash...)获取某个服务实例
     * 说明:这个对象是我们项目添加Spring cloud以后,系统启动时会自动创建这个对象
     * 所以我们需要时,直接从spring容器获取即可*/
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho02(){
        //1.方案一:自定义负载均衡
/*
        String url1="http://localhost:8081/provider/echo/{msg}";
        String url2="http://localhost:8082/provider/echo/{msg}";
        String [] urls={url1,url2};
        String url=urls[new Random().nextInt(urls.length)];
        return restTemplate.getForObject(url,String.class,serverPort);*/
        //2方案2:基于loadBalancerClient对象实现负载均衡
        ServiceInstance serviceInstance =
                loadBalancerClient.choose("sca-provider");
        String ip=serviceInstance.getHost();
        int port=serviceInstance.getPort();
        /*用+号拼接*/
        String url="http://"+ip+":"+port+"/provider/echo/{msg}";
        /**两种方法*/
        /*用占位符方式构建url字符串,%s表示字符串占位符*/
//        String url=String.format("http://%s:%s/provider/echo/{msg}",ip,port);
        return restTemplate.getForObject(url,String.class,serverPort);
    }
    @Autowired
private RestTemplate LoadBalancedRestTemplate;
    @GetMapping("/consumer/doRestEcho3")
    public String doRestEcho3(){
        String serviceId="sca-provider";
        String url=String.format("http://%s/provider/echo/{msg}", serviceId);
        //当这里进行远程服务调用用(RPC)是,底层会这个请求进行拦截,
        //然后基于LoadBalancerClient对象通过服务名获取具体的服务实例(ServiceInstance)
        return LoadBalancedRestTemplate.getForObject(url,String.class,serverPort);
    }
}
